package Stack;
import java.util.*;
public class MinStack {
    private final java.util.Stack<Integer> stack;              //一个栈正常放数据，删数据
    private final java.util.Stack<Integer> minStack;           //这个最小栈只放相对的最小值，删除相应得最小值

    public MinStack() {
        stack = new java.util.Stack<>();
        minStack = new java.util.Stack<>();
    }

    public void push(int val) {
        stack.push(val);
        if (minStack.empty()) {              //如果最小栈里面没有元素，那么不管多大的数据他都要放入
            minStack.push(val);
        } else {                             //如果最小栈中存在的元素，那么就进行比较，如果val值比栈顶的元素大就不放入,等于的时候也要放入，保证删除了这个元素后，最小栈不为空
            if (val <= minStack.peek()) {
                minStack.push(val);
            }
        }

    }

    public void pop() {
        if (stack.peek().equals(minStack.peek())) {         //因为最小栈的栈顶放的是最小元素，所以如果原来的栈已经把这个元素删除了，那么最小栈的这个元素也要删除，此时的最小值是需要更新的
            minStack.pop();
        }
        stack.pop();
    }

    public int top() {
        return stack.peek();
    }

    public int getMin() {
        return minStack.peek();
    }
}
